# -*- coding:utf-8 -*-
import threading

# 多线程，执行两种相同的方法时，有可能会出现资源竞争的问题
"""
如以下运行结果：
    子线一——正在修改num为：94
    子线程二——正在修改num为：94
"""

# 多线程只是实现异步的一种方式，多线程不一定是异步

# 为了避免上面情况，可以使用线程锁
# 线程锁
"""
其一是可以考虑使用锁来处理，当多个线程对同一份资源进行读写操作时，
我们可以通过加锁来确保数据安全。Python中给出了多种锁的实现，
例如：同步锁 Lock，递归锁 RLock，条件锁 Condition，事件锁 Event，
信号量锁 Semaphore，这里演示 Lock锁的使用方式
"""

#  Lock锁，是一种同步锁

num = 100
lock = threading.Lock()


def fun_one():
    for i in range(200):
        global num
        lock.acquire()     # 加锁
        if num > 0:
            print(f"子线一——正在修改num为：{num}")
        num -= 1
        lock.release()     # 解锁


def fun_two():
    for i in range(200):
        global num
        lock.acquire()  # 加锁
        if num > 0:
            print(f"子线程二——正在修改num为：{num}")
        num -= 1
        lock.release()  # 解锁


def main():
    t1 = threading.Thread(target=fun_one)
    t2 = threading.Thread(target=fun_two)
    t1.start()
    t2.start()


if __name__ == '__main__':
     main()
